import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { CreateTagDto } from './dto/create-tag.dto';
import { UpdateTagDto } from './dto/update-tag.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Tags } from './entities/tag.entity';

@Injectable()
export class TagsService {
  constructor(
    @InjectRepository(Tags)
    private readonly tagsRepository: Repository<Tags>,
  ) {}

  async create(createTagDto: CreateTagDto) {
    const { name } = createTagDto;
    const oldTag = await this.tagsRepository.findOne({
      where: { name },
    });
    if (oldTag) {
      throw new HttpException('标签已存在', HttpStatus.BAD_REQUEST);
    }
    const tags = this.tagsRepository.create(createTagDto); //创建对象
    return await this.tagsRepository.save(tags); // 将数据写入数据库
  }

  async findAll() {
    return await this.tagsRepository.find();
  }

  async findOne(id: number) {
    return await this.tagsRepository.findOneBy({ id: id });
  }

  async update(id: number, updateTagDto: UpdateTagDto) {
    const existTag = await this.tagsRepository.findOneBy({
      id: id,
    });
    if (!existTag) {
      throw new HttpException(`id为${id}的标签不存在`, HttpStatus.FORBIDDEN);
    }
    const tagToUpdate = this.tagsRepository.merge(existTag, updateTagDto);
    return await this.tagsRepository.save(tagToUpdate);
  }

  async remove(id: number) {
    const existTag = await this.tagsRepository.findOneBy({ id: id });
    if (!existTag) {
      throw new HttpException(`id为${id}的标签不存在`, HttpStatus.FORBIDDEN);
    }
    return await this.tagsRepository.remove(existTag);
  }

  async findByIds(ids: number[]) {
    return this.tagsRepository.findByIds(ids);
  }

  /**
   * 获取所有标签下的文章数量
   */
  async getRelation() {
    const tags = await this.tagsRepository
      .createQueryBuilder('tags')
      .leftJoinAndSelect('tags.posts', 'posts')
      .select(['tags.id', 'tags.name', 'posts.id'])
      .getMany();
    return tags.map((tag) => {
      tag['value'] = tag.posts.length;
      delete tag['posts'];
      return tag;
    });
  }
}
